package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import model.Dependente;


public class DependenteDAO implements IDependenteDAO {

	@Override
	public boolean insert(Dependente d) {
		String sql = "insert into dependente (nome, dt_nascimento, certidao_nascimento, pessoa_id_pessoa) values (?,?,?,?);";
		Connection conn = ConnectionManneger.getConnection();
		
		try {
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setObject(1, d.getNome() );
			ps.setObject(2, d.getDt_nascimento() );
			ps.setObject(3, d.getCertidao_nascimento() );
			ps.setObject(4, d.getPessoa_id_pessoa() );

			return ps.executeUpdate() > 0;
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			ConnectionManneger.closeConnection();
		}
		return false;
	}

	@Override
	public boolean update(Dependente d) {
		String sql = "update dependente set nome = ?, dt_nascimento = ?, certidao_nascimento = ?, pessoa_id_pessoa = ? where id_dependente = ?";
		Connection conn = ConnectionManneger.getConnection();
		
		try {
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setObject(1, d.getNome() );
			ps.setObject(2, d.getDt_nascimento() );
			ps.setObject(3, d.getCertidao_nascimento() );
			ps.setObject(4, d.getPessoa_id_pessoa() );
			ps.setObject(5, d.getId_dependente() );

			return ps.executeUpdate() > 0;
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			ConnectionManneger.closeConnection();
		}
		return false;
	}

	@Override
	public boolean delete(Dependente d) {
		String sql = "delete from dependente where id_dependente = ?";
		Connection conn = ConnectionManneger.getConnection();
		
		try {
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setObject(1,d.getId_dependente() );
			
			return ps.executeUpdate() > 0;
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			ConnectionManneger.closeConnection();
		}
		return false;
	}

	@Override
	public boolean existeRegistro(int id) {
		String sql = "select count(*) as qtd from dependente where id_dependente = ?";
		Connection conn = ConnectionManneger.getConnection();
		try {
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setObject(1, id );
			
			ResultSet rs = ps.executeQuery();
			
			rs.next();
			int total = rs.getInt("qtd");
			return total > 0;
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			ConnectionManneger.closeConnection();
		}
		return false;
	}

	@Override
	public Dependente findById(int id) {
		String sql = "select id_dependente, nome, dt_nascimento, certidao_nascimento, pessoa_id_pessoa"
				+ " from dependente where id_dependente = ?";
		Connection conn = ConnectionManneger.getConnection();
		try {
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setObject(1, id );
			
			ResultSet rs = ps.executeQuery();
			
			return rs.next() ? 
					new Dependente(rs.getInt("id_dependente"),
								rs.getString("nome"),
								rs.getDate("dt_nascimento"),
								rs.getString("certidao_nascimento"),
								rs.getInt("pessoa_id_pessoa")) : null;
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			ConnectionManneger.closeConnection();
		}
		return null;
	}

	@Override
	public List<Dependente> findAll() {
		List<Dependente> dependentes = new ArrayList<Dependente>();
		String sql = "select id_dependente, nome, dt_nascimento, certidao_nascimento, pessoa_id_pessoa"
				+ " from dependente";
		Connection conn = ConnectionManneger.getConnection();
		
		try {
			PreparedStatement ps = conn.prepareStatement(sql);
			
			ResultSet rs = ps.executeQuery();
			
			while ( rs.next() ) {
				dependentes.add(					
					new Dependente(rs.getInt("id_dependente"),
							rs.getString("nome"),
							rs.getDate("dt_nascimento"),
							rs.getString("certidao_nascimento"),
							rs.getInt("pessoa_id_pessoa"))
				);
			} 
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			ConnectionManneger.closeConnection();
		}
		return dependentes;
	}

	@Override
	public boolean insertUpdate(Dependente d) {
		if(existeRegistro(d.getId_dependente())){
			return update(d);
		}
		else{
			return insert(d);
		}
	}

	@Override
	public List<Dependente> findDependentesByPessoaId(int id_pessoa) {
		List<Dependente> dependentes = new ArrayList<Dependente>();
		String sql = "select id_dependente, nome, dt_nascimento, certidao_nascimento, pessoa_id_pessoa"
				+ " from dependente where pessoa_id_pessoa = ?";
		Connection conn = ConnectionManneger.getConnection();
		
		try {
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setObject(1, id_pessoa );
			
			ResultSet rs = ps.executeQuery();
			
			while ( rs.next() ) {
				dependentes.add(					
					new Dependente(rs.getInt("id_dependente"),
							rs.getString("nome"),
							rs.getDate("dt_nascimento"),
							rs.getString("certidao_nascimento"),
							rs.getInt("pessoa_id_pessoa"))
				);
			} 
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			ConnectionManneger.closeConnection();
		}
		return dependentes;
	}

	@Override
	public int getTotalDependentes(int id_pessoa) {
		String sql = "select count(*) as qtd from dependente where pessoa_id_pessoa = ?";
		Connection conn = ConnectionManneger.getConnection();
		try {
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setObject(1, id_pessoa );
			
			ResultSet rs = ps.executeQuery();
			
			rs.next();
			int total = rs.getInt("qtd");
			return total;
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			ConnectionManneger.closeConnection();
		}
		return 0;
	}


}
